﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

using SIGCBI.WebMVC4.Models;
using SIGCBI.Entities;
using SIGCBI.BusinessLogic;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using System.Text;
using System.Security.Cryptography;

namespace SIGCBI.WebMVC4.Controllers
{
    public class PartidaController : Controller
    {
        [Dependency]
        public IPartidaBL partidaBL { get; set; }

        [Dependency]
        public ICentroCostoBL areaBL { get; set; }

        public ActionResult Index()
        {
            var contratos = partidaBL.GetAllFromPartidas();
            return View(contratos);
        }

        [HttpPost]
        public ActionResult Index(string codigo = "", string nombre = "")
        {
            var criterio = "";
            if (codigo != string.Empty)
            {
                criterio = codigo;
            }
            else if (nombre != string.Empty)
            {
                criterio = nombre;
            }

            var partidas = partidaBL.GetFromPartidasByNombre(criterio);
            return View(partidas);
        }

        public ActionResult Create()
        {
            return PartialView();
        }

        [HttpPost]
        public ActionResult Create(PARTIDA partida)
        {
            if (ModelState.IsValid)
            {
                var _partida = partidaBL.ValidarDuplicidadPartida(partida.Codigo, partida.Id);

                if (_partida == null)
                {
                    partidaBL.AddPartida(partida);
                    return this.DialogResult("Registro Correcto");  // Close dialog via DialogResult call
                }
                else
                    ModelState.AddModelError("", string.Format("Ya existe una Partida con el mismo Código"));
            }
            return PartialView(partida);
        }

        public ActionResult Edit(int id = 0)
        {
            if (id == 0)
                return this.DialogResult();
            
            var _partida = partidaBL.GetFromPartidaById(id);

            if (_partida == null)
                return this.DialogResult();

            return PartialView("Edit", _partida);
        }

        [HttpPost]
        public ActionResult Edit(int id, PARTIDA partida)
        {
            if (ModelState.IsValid)
            {
                var _partida = partidaBL.ValidarDuplicidadPartida(partida.Codigo, partida.Id);

                if (_partida == null)
                {
                    partidaBL.UpdatePartida(partida);
                    return this.DialogResult("Modificacion Correcta");  // Close dialog via DialogResult call
                }
                else
                    ModelState.AddModelError("", string.Format("Ya existe una Partida con el mismo Código"));
            }
            return PartialView(partida);
        }

        public ActionResult Details(int id = 0)
        {
            if (id == 0)
                return this.DialogResult();

            var _partida = partidaBL.GetFromPartidaById(id);
            if (_partida == null)
                return this.DialogResult();
        
            return PartialView("Details", _partida);
        }

        public ActionResult RastreoTotal(int id = 0)
        {
            if (id == 0)
            {
                return RedirectToAction("Index", "Partida");
            }

            var partida = partidaBL.GetFromPartidaById(id);

            if (partida == null)
            {
                return RedirectToAction("Index", "Partida");
            }

            ViewData["porcentaje"] = (100) / partida.Presupuesto;
            //ViewData["porcentaje"] = (partida.MontoGastado * 100) / partida.Presupuesto;
            return View(partida);
        }

        public ActionResult RastreoPorArea(int id = 0)
        {
            if (id == 0)
            {
                return RedirectToAction("Index", "Partida");
            }

            var partida = partidaBL.GetFromPartidaById(id);

            if (partida == null)
            {
                return RedirectToAction("Index", "Partida");
            }            
            
            return View(partida);
        }

        public ActionResult ViewDetails(int idArea, int idPartida)
        {
            var detalle = partidaBL.GetFromDetallePartidaByIdAreaAndIdPartida(idArea, idPartida);
            var gastos = partidaBL.GetAllGastosFromReducirPresupuestoByIdPartida(idPartida).Sum(a => a.Monto);

            ViewData["porcentaje"] = (gastos * 100) / detalle.MontoAsignado;

            return PartialView("ViewDetails", detalle);
        }

        public ActionResult Reporte(int id = 0)
        {
            return View();
        }

        public ActionResult AsignarPartidaArea()
        {
            return View();
        }

        public ActionResult Search(string nombreArea)
        {
            var result = areaBL.GetAllFromArea()
                .Where(r => r.Descripcion.ToUpper().StartsWith(nombreArea.ToUpper())
                    || r.Codigo.ToUpper().Contains(nombreArea.ToUpper()))
                .Take(10)
                .Select(r => new { id = r.ID, label = r.Descripcion, encargado = r.TRABAJADOR.NombreCompleto, name = "Id_Area" });

            return Json(result, JsonRequestBehavior.AllowGet);
        }

        public ActionResult SearchPartida(string nombrePartida)
        {
            var result = partidaBL.GetAllFromPartidas()
                .Where(r => r.Nombre.ToUpper().StartsWith(nombrePartida.ToUpper())
                    || r.Nombre.ToUpper().Contains(nombrePartida.ToUpper()))
                .Take(10)
                .Select(r => new { id = r.Id, label = r.Nombre, saldo = r.Presupuesto - r.REDUCIR_PRESUPUESTO.Sum(a => a.Monto), name = "Id_Partida"});

            return Json(result, JsonRequestBehavior.AllowGet);
        }

        [HttpPost]
        public ActionResult AsignarPartidaArea(DETALLE_PARTIDA detalle, FormCollection colection)
        {
            try
            {
                detalle.IdFuenteFinanciera = colection["Id_Area"].ToString() == "" ? 0 : Int32.Parse(colection["Id_Area"].ToString());
                detalle.IdPartida = colection["Id_Partida"].ToString() == "" ? 0 : Int32.Parse(colection["Id_Partida"].ToString());
                
                var _partida = partidaBL.GetFromPartidaById(detalle.IdPartida);

                if (_partida != null)
                {
                    //if (detalle.MontoAsignado <= _partida.Saldo)
                    //{
                        var existe = partidaBL.GetFromDetallePartidaByIdAreaAndIdPartida(detalle.IdFuenteFinanciera, detalle.IdPartida);
                        if (existe == null)
                        {
                            partidaBL.AddDetallePartida(detalle);
                            ViewBag.ResultMessage = "Registro Correcto";
                        }
                        else
                            ViewBag.ResultMessage = "Ya existe una partida asignada a esta area";
                    //}
                    //else
                    //    ViewBag.ResultMessage = "El monto asignado excede el maximo permitido";
                }
            }
            catch (Exception ex)
            {
                ViewBag.ResultMessage = ex.Message;
            }
            return View(detalle);
        }

        public ActionResult CambiarPresupuesto()
        {
            return View();
        }

        [HttpPost]
        public ActionResult CambiarPresupuesto(CAMBIO_PARTIDAS detalle, FormCollection colection)
        {
            try
            {
                detalle.IdOrigen = colection["Id_PartidaO"].ToString() == "" ? 0 : Int32.Parse(colection["Id_PartidaO"].ToString());
                detalle.IdDestino = colection["Id_PartidaD"].ToString() == "" ? 0 : Int32.Parse(colection["Id_PartidaD"].ToString());

                var _partidaO = partidaBL.GetFromPartidaById(detalle.IdOrigen);
                var _partidaD = partidaBL.GetFromPartidaById(detalle.IdDestino);

                if (_partidaO != null && _partidaD != null)
                {
                    //if (detalle.Monto <= _partidaO.Saldo)
                    //{
                        partidaBL.AddCambioPartida(detalle);
                        ViewBag.ResultMessage = "Registro Correcto";
                    //}
                    //else
                    //    ViewBag.ResultMessage = "El monto asignado excede el maximo permitido";
                }
            }
            catch (Exception ex)
            {
                ViewBag.ResultMessage = ex.Message;
            }
            return View(detalle);
        }


    }
}
